home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / snip1292.zip / MEMLIST.C < prev    next >
C/C++ Source or Header  |  1992-12-26  |  4KB  |  115 lines

  1. /**************************** MEMLIST.C *************************
  2. *       A Program to list memory-resident programs by name.     *
  3. *       by Nigel Cort based on work on undocumented DOS calls.  *
  4. *       See text for details (c) 1988 C Gazette. Use freely     *
  5. *       but acknowledge source.                                 *
  6. *       Usage: memlist                                          *
  7. ****************************************************************/
  8.  
  9. /* Verified for MSC, Turbo, Watcom, Zortech  */
  10.  
  11. #include <stdio.h>
  12. #include <dos.h>
  13. #include <ctype.h>
  14.  
  15. void get_dos_info();
  16. unsigned int peek_w();
  17. char peek_b();
  18.  
  19. union  REGS  inregs, outregs;
  20. struct SREGS segments;
  21.  
  22. #define PSP peek_w(memseg, memofs + 1)
  23. #define LEN peek_w(memseg, memofs + 3)
  24.  
  25. #ifndef MK_FP
  26. #define MK_FP(segment,offset)  ((void far *) \
  27.                (((unsigned long)(segment) << 16) + (unsigned)(offset)))
  28. #endif
  29. main()
  30. {
  31.     unsigned int dosinfoseg, dosinfoofs;
  32.     int memseg, memofs;
  33.     int header_byte,
  34.         envirseg,
  35.         envirofs,
  36.         envirspace,
  37.         c;
  38.  
  39.     get_dos_info (&dosinfoseg, &dosinfoofs);
  40.                                          /* int 52h to get DOS info address */
  41.                                          /* and corrects it to header chain */
  42.  
  43.     memofs = peek_w (dosinfoseg, dosinfoofs);
  44.     memseg = peek_w (dosinfoseg, dosinfoofs + 2);
  45.  
  46.     do
  47.     {
  48.         header_byte = peek_b (memseg, memofs);
  49.         printf ("%04X", memseg);
  50.         printf (" - %04X ", memseg + LEN);
  51.         if (PSP == 0)
  52.             printf ("(%6ld bytes) free\n", LEN * 16L);
  53.         else
  54.         {
  55.             printf ("(%6ld bytes)", LEN * 16L);
  56.             if (PSP == memseg + 1)
  57.                 printf (" prog ");
  58.             else
  59.                 printf (" data ");
  60.  
  61.             envirseg = peek_w (PSP, 0x2C);    /* Byte 2Ch in PSP points */
  62.             if (envirseg == 0)                /* to program environment */
  63.                 puts ("No environment");
  64.             else
  65.             {
  66.                 envirofs = 0;
  67.                 envirspace = peek_w (envirseg - 1, 3) * 16;
  68.                 do
  69.                     envirofs += 1;
  70.                 while (peek_w (envirseg, envirofs) != 0 &&  /* Read thru  */
  71.                        envirofs <= envirspace);        /* environment for */
  72.                 envirofs += 4;                         /* two zero bytes  */
  73.                 if (envirofs >= envirspace)
  74.                     puts ("No taskname in environment");
  75.                 else
  76.                 {
  77.                     while (c = peek_b (envirseg, envirofs)) /* Print out  */
  78.                     {                                  /* the name 1 char */
  79.                         putc (toupper (c), stdout);    /* at a time.      */
  80.                         envirofs += 1;
  81.                     }
  82.                     putc ('\n', stdout);
  83.                 }
  84.             }
  85.         }
  86.         memseg += 1 + LEN;
  87.     }
  88.     while (header_byte != 'Z');                  /* Z marks end of chain */
  89.     return (1);
  90. }
  91.  
  92. /*  Gets the address of the DOS info list returned in ES:BX
  93.     The address of the first memory block header is located
  94.     four bytes before this info list. */
  95.  
  96. void get_dos_info (unsigned int *seg, unsigned int *ofs)
  97. {
  98.     inregs.h.ah = 0x52;
  99.     int86x (0x21, &inregs, &outregs, &segments);
  100.     *seg = segments.es;
  101.     *ofs = outregs.x.bx - 4;
  102. }
  103.  
  104. char peek_b (unsigned seg, unsigned ofs)  /* Returns a byte from memory */
  105. {
  106.     char far * fcp = MK_FP(seg, ofs);
  107.     return (*fcp);
  108. }
  109.  
  110. unsigned peek_w (unsigned seg, unsigned ofs)  /* Returns a word from memory */
  111. {
  112.     unsigned int far *fup = MK_FP (seg, ofs);
  113.     return (*fup);
  114. }
  115.